#include"blockqueue.hpp"
#include<functional>
using func_t=function<void()>;
void print(){
    cout<<"打印中..."<<endl;
    sleep(1);
}
void download(){
    cout<<"下载中..."<<endl;
    sleep(1);
}
void getlog(){
    cout<<"获得日志中..."<<endl;
    sleep(1);
}
void browse(){
    cout<<"浏览中..."<<endl;
    sleep(1);
}
vector<func_t>task;
int cnt=0;
void * consumer(void *arg){
    //生产者快：
   // sleep(2);

    blockqueue<func_t>* pbq=static_cast< blockqueue<func_t>*>(arg);
   while(1){
   func_t tk= pbq->Pop();
    tk();
     
   }
}  

void * producter(void *arg){
    blockqueue<func_t>* pbq=static_cast< blockqueue<func_t>*>(arg);
     while(1){
        //消费者快
        sleep(2);

        //cout<<"生产一个任务..."<<endl;
        pbq->equeue(task[cnt%task.size()]);
        //生产者快：
        cout<<"生产一个任务..."<<endl;

        cnt++;
        
     }
}

int main(){
     task.push_back(print);
     task.push_back(download);
     task.push_back(getlog);
     task.push_back(browse);
     blockqueue<func_t> bq;
    pthread_t c[2],p[3];
    pthread_create(c,nullptr,consumer,&bq);
    pthread_create(c+1,nullptr,consumer,&bq);
    pthread_create(p,nullptr,producter,&bq);
    pthread_create(p+1,nullptr,producter,&bq);
    pthread_create(p+2,nullptr,producter,&bq);
    

    pthread_join(*c,nullptr);
    pthread_join(*(c+1),nullptr);

    pthread_join(*p,nullptr);
    pthread_join(*(p+1),nullptr);
    pthread_join(*(p+2),nullptr);
 





    
}